#ifndef UDPCLIENT_H
#define UDPCLIENT_H

#pragma once
#include<winsock2.h>
#include<windows.h>
#include <Shlobj.h>
#include <tchar.h>
#include<time.h>
#include<string>
#include<thread>
#include<iostream>
#include<QDebug>
using namespace std;

#pragma warning(disable:4996)
#pragma comment(lib,"ws2_32.lib")
#define SBUF_SIZE 32   //发送缓存的大小
#define RBUF_SIZE 32	//接受缓存的大小
#define pport 53377	//peerport:用来两台主机交流时的socket的port

class point {
public:
    int x;
    int y;
    point() {}
    point(int a, int b) :x(a), y(b) {}
    ~point() {}
};

class UDPClient
{
public:
    UDPClient();
    int cport;	//用于创建客户端嵌套字的端口

    //写data到缓冲数组
    void Send(point x);

    //从缓冲数组中读数据
    point Rece();

    //往peer客户端发送sdata内的数据
    void SendData();

    //获取peer发来的数据到rdata
    void ReceData();

    //构造函数
    UDPClient(char* ip, int port);

    //析构函数
    ~UDPClient();



private:
    SOCKADDR_IN sersin;		//服务器的socket地址
    SOCKET cli;		//客户端用于交流的套接字
    SOCKADDR_IN peer;	//另一个客户端的socket地址
    char* rdata;	//直接与socket传输交互的数组
    char* sdata;	//直接与socket传输交互的数组
    char* rdata_;	//直接与程序交互的缓冲数组
    char* sdata_;	//直接与程序交互的缓冲数组
    bool srejoin;		//控制是否继续发rejoin包
    int sinlen;		//SOCKADDR_IN类型长度

    //请求版本协议(socket的前提）
    int Wsa();

    //创建客户端与其他方交流的套接字
    SOCKET CreateSocketUDP();

    //往服务器发送数据
    void SendToSer();

    //与服务器交流获得另一个客户端的socket地址
    SOCKADDR_IN TalkServer();

    //接收socket信息
    void ReceSOCKADDR_IN();

    //绑定peer到cli
    void Connect();


};



#endif // UDPCLIENT_H
